//vuex仓库的地方
//引入进来Vuex:插件对象 install方法 、Store方法[构造函数,这个类的实例即为仓库]
import Vuex from 'vuex'
//引入Vue核心库[2.6.14版本]
import Vue from 'vue'
//安装插件
Vue.use(Vuex);

//创建仓库对外暴露仓库[即为:Store类的一个实例]
//Store内部需要传递一个配置对象[K没有商量的余地，不能瞎写、胡写、乱写]
export default new Vuex.Store({
    //state[状态]:整个仓库存储数据地方
    state: {
        //计数器的数据---仓库
        count: 1,
        students: [{ name: "豪哥", age: 3 }, { name: "郑君", age: 16 }, { name: '晓婷', age: 8 }],
        msg:"我爱你塞北的雪"
    },
    //mutations[工人地盘]:唯一可以修改state数据的地方
    mutations: {
        ADDONE(state) {
            //this:也是仓库Store类的实例，vuex几乎不会使用this!!!!
            //state:即为仓库里面的数据 ---->count、students数据！！！！
            state.count++;
        },
        MINUSONE(state) {
            state.count--;
        },
        ADDHUNDRED(state, payload) {
            state.count += payload[0].num;
        },
        DELAY(state, five) {
            state.count -= five;
        },
        CHANGEMSG(state,val){
            state.msg = val;
        }
    },
    //actions:[经理地盘],处理业务:if|异步语句[定时器、延迟器、ajax发请求...]
    //actions:这里不能直接修改数据,只能处理业务[同意申请、不同意申请]
    actions: {
        //addOne类型的action[经理]
        //第一个参数:注入一个对象{state:'xxx',commit:'xxx',dispatch:'xxx'}
        addOne({ state, commit, dispatch }) {
            //this:即为Store类的实例，仓库。vuex仓库咱们一般都不会使用this！！！
            //state:即为仓库的数据
            //dispatch:能调用actions里面相应的函数
            //commit:调用相应'工人的函数'
            //addOne:这个经理同意这次申请,需要找到相应的工人开始干活[工人的名字一般都是大写]
            commit('ADDONE')
        },
        //minusOne类型的action
        minusOne({ state, commit, dispatch }) {
            //经理的名字与工人的名字一般都是一样的[经理:都是小写、工人:大写的]
            commit('MINUSONE')
        },
        //addEven类型的action
        addEven({ state, commit, dispatch }) {
            //书写业务逻辑，但是不能修改state数据
            //我只是判断数据是不是偶数
            if (state.count % 2 == 0) {
                commit('ADDONE')
            }
        },
        //minusOdd类型的action
        minusOdd({ state, commit, dispatch }) {
            if (state.count % 2 != 0) {
                commit('MINUSONE');
            }
        },
        //addHundred类型的action
        //'经理可以收VC礼物',只能收礼一个多个不行！！！
        addHundred({ state, commit, dispatch }, payload) {
            //相当于经理找工人干活,把刘老大送的礼物给工人！！！！
            commit('ADDHUNDRED', payload);
        },
        //delay类型的action
        delay({ state, commit, dispatch }, payload) {
            //在这里书写异步语句--业务
            setTimeout(() => {
                commit('DELAY', payload);
            }, 2000);
        },
        changeMsg({state,commit,dispatch},val){
             commit('CHANGEMSG',val);
        }
    },
    getters: {
        //很像当年咱们学习组件中配置项,计算属性！！！
        //函数返回结果是这个属性的属性值
        allAge(state) {
            //getters当中函数内部没有this
            return state.students.reduce((prev, next) => prev + next.age, 0);
        },
        //计算出年龄最大的同学，将年龄返回！！！
        bigAge(state) {
            return state.students.reduce((prev, next) => prev > next.age ? prev : next.age, 0)
        }
    }

})